package com.Lgwd.service.monsterService.monsterImpl;

import com.Lgwd.entity.MonsterEntiy;
import com.Lgwd.repository.MonsterRepository;
import com.Lgwd.service.monsterService.MonsterService;
import com.Lgwd.utils.RandomUtils;
import lombok.extern.slf4j.Slf4j;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import java.util.List;


@Slf4j
@Service
public class MonsterServiceImpl implements MonsterService {


    @Autowired
    MonsterRepository monsterRepository;

    /**
     * 添加怪物方法
     * 按百分比添加
     * 生命每级+5%
     * 攻击力每级+10%
     * 防御每级+5%
     * 属性成长每级=当前怪物攻击力x20%
     * 等级+1
     *
     * @param
     * @return
     */
    @Override
    public void addMonster() {

        //查询所有怪物信息
        List<MonsterEntiy> list = monsterRepository.findAll();

        //获取最后一个怪物信息
        MonsterEntiy monsterLast = list.get(list.size() - 1);

        //新建怪物对象 用于保存新的属性
        MonsterEntiy saveMoster = new MonsterEntiy();
        //调用计算器进行机损
        if (monsterLast.getMonster_lv()<monsterLast.getLv_scope()){
            saveMoster.setLv_scope(monsterLast.getLv_scope());
        }else{
            saveMoster.setLv_scope(monsterLast.getLv_scope()+3);
        }
        saveMoster.setMonster_HP(MathRoundMonster(monsterLast.getMonster_HP(), "")); //设置新怪物HP成长
        saveMoster.setMonster_A(MathRoundMonster(monsterLast.getMonster_A(), ""));//设置新怪物攻击成长
        saveMoster.setMonster_DF(MathRoundMonster(monsterLast.getMonster_DF(), "DF"));//设置新怪物防御成长
        saveMoster.setMonster_property(MathRoundMonster(monsterLast.getMonster_A(), "property"));//设置新怪物全属性（血量 最大攻击挂钩）成长
        saveMoster.setMonster_lv(monsterLast.getMonster_lv() + 1);
        saveMoster.setGive_ex(MathRoundMonster(monsterLast.getGive_ex(), "ex"));

        log.info("【新增的怪物信息为】：" + saveMoster);

        monsterRepository.save(saveMoster);

    }


    /**
     * 怪物属性递增计算器
     * 生命每级+10%
     * 攻击力每级+10%
     * 防御每级+5%
     * 属性成长每级=当前怪物攻击力x20%
     * @param data
     * @param property
     * @return
     */
    @Override
    public int MathRoundMonster(int data, String property) {
        int i = data;
        double b = 0;
        //防御力只递增15%
        if (property.equals("DF")) {
            b = i + i * 0.05 + 0.5;
        } else if (property.equals("property")) {
            //全属性成长: 按照怪物攻击力增长20%
            b = i + i * 0.2 + 0.5;
        } else if(property.equals("ex")){
            b = i + i * 0.09 + 0.5;
        }else {
            //其余属性递增20%
            b = i + i * 0.10 + 0.5;
        }
        //有小数点四舍五入保留
        int c = (int) Math.round(b);
        return c;
    }


    /**
     * 生成对应等级的怪物
     * 根据等级范围内 随机生成某只怪物
     *
     * @param userLv
     * @return
     */
    @Override
    public MonsterEntiy getMonsterByUserLv(int userLv) {
        //找到等级范围内的取值
        int lv = MonsterLv(userLv);
        //获取该范围内的怪物列表
        List<MonsterEntiy> list = monsterRepository.findByLv_scope(lv);
        return list.get(RandomUtils.getRangeStr(0,3));
    }


    public int MonsterLv(int userLv) {
        if (userLv >= 0 && userLv <= 3) {
            return 3;
        }
        if (userLv >= 4 && userLv <= 6) {
            return 6;
        }
        if (userLv >= 7 && userLv <= 9) {
            return 9;
        }
        if (userLv >= 10 && userLv <= 12) {
            return 12;
        }
        if (userLv >= 13 && userLv <= 15) {
            return 15;
        }
        if (userLv >= 16 && userLv <=18) {
            return 18;
        }
        if (userLv >= 19 && userLv <=21) {
            return 21;
        }
        if (userLv >= 22 && userLv <=24) {
            return 24;
        }
        if (userLv >= 25 && userLv <=27) {
            return 27;
        }
        if (userLv >= 28 && userLv <=30) {
            return 30;
        }
        if (userLv >= 31 && userLv <=33) {
            return 33;
        }
        if (userLv >= 34 && userLv <=36) {
            return 36;
        }
        if (userLv >= 37 && userLv <=39) {
            return 39;
        }
        if (userLv >= 40 && userLv <=42) {
            return 42;
        }
        if (userLv >= 43 && userLv <=45) {
            return 45;
        }
        if (userLv >= 46 && userLv <=48) {
            return 48;
        }
        if (userLv >= 49 && userLv <=51) {
            return 51;
        }
        if (userLv >= 52 && userLv <=54) {
            return 54;
        }
        if (userLv >= 55 && userLv <=57) {
            return 57;
        }
        if (userLv >= 58 && userLv <=60) {
            return 60;
        }
        if (userLv >= 61 && userLv <=63) {
            return 63;
        }
        if (userLv >= 64 && userLv <=66) {
            return 66;
        }
        if (userLv >= 67 && userLv <=69) {
            return 69;
        }
        return 0;
    }
}
